package kickboxing.controller;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import kickboxing.model.Uzytkownik;
import kickboxing.util.HibernateUtil;

public class UzytkownikManager extends HibernateUtil {
	
	/**
	 * Metoda rejestrujaca uzytkownika i zapisujaca jego dane do bazy
	 * @param uzytkownik
	 * @return
	 */
	public Uzytkownik rejestruj(Uzytkownik uzytkownik){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		uzytkownik.setAktywowany("NIE");
		session.save(uzytkownik);
		session.getTransaction().commit();
		return uzytkownik;
		
	}
	
	/**
	 * Metoda sprawdzajaca czy podany login lub mail istnieje w bazie danych
	 * @param login
	 * @param mail
	 * @return true - jezeli dany login lub mail nie istnieje <br> false - jezeli istnieje
	 * 
	 * 
	 */
	public boolean sprawdzLoginIMail(String login, String mail){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Uzytkownik> lista = null;
		Query q = session.createQuery("from Uzytkownik where login = '" + login + "' or mail = '" + mail + "'");
		lista = q.list();
		
		boolean wynik = false;
		if(lista.isEmpty() == true)
			wynik = true;
		else
			wynik = false;
		session.getTransaction().commit();
		return wynik;
		
	}
	
	/**
	 * Metoda sluzaca do logowania uzytkownika i sprawdzajaca czy podany uzytkownik jest aktywowany oraz czy posiada prawa administratora
	 * @param login
	 * @param haslo
	 * @param request
	 * @return
	 */
	public boolean loguj(String login, String haslo, HttpServletRequest request){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Uzytkownik> lista = null;
		Query q = session.createQuery("from Uzytkownik where login = '" + login + "' and haslo = '" + haslo + "'");
		lista = q.list();
		
		boolean wynik = false;
		if(lista != null){
			for (Uzytkownik user : lista) {
				
				if(user.getPrawa()=='a'){
					String admin = "TAK";
					request.setAttribute("admin", admin);
				}else if(user.getPrawa() != 'a'){
					String admin = "NIE";
					request.setAttribute("admin", admin);
					if(user.getAktywowany().equals("NIE")){
						String aktywacja = "NIE";
						request.setAttribute("aktywacja", aktywacja);
					}else{
						String aktywacja = "TAK";
						request.setAttribute("aktywacja", aktywacja);
					}
				}
				
				wynik = true;
			
			}	
		}else{
			wynik = false;
			
		}
		session.getTransaction().commit();
		return wynik;
		
	}
	
	/**
	 * Metoda sluzaca do wczytania podanego uzytkownika z bazy na podstawie loginu
	 * @param login - login uzytkownika ktorego chcesz zaladowac
	 * @return
	 */
	public Uzytkownik zaladujUzytkownika(String login){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Uzytkownik> lista = null;
		Query q = session.createQuery("from Uzytkownik where login = '" + login + "'");
		lista = q.list();
		Uzytkownik uzytkownik = null;
		
		if(lista.isEmpty() == false){
			for (Uzytkownik user : lista) {
				uzytkownik = (Uzytkownik) session.load(Uzytkownik.class, user.getId_uzytkownika());
			}
		}
				
		session.getTransaction().commit();
		
		return uzytkownik;
	}
	
	/**
	 * Metoda zwracajaca liste nieaktywowanych uzytkowniko
	 * @param response
	 * @param out
	 * @return lista nieaktywowanych uzytkownikow
	 */
	public List<Uzytkownik> nieaktywowani(HttpServletResponse response, JspWriter out){
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		
		List<Uzytkownik> lista = null;

		try{
			
			Query q = session.createQuery("from Uzytkownik where aktywowany = 'NIE' and prawa='u' ");
			
			lista = q.list();
		
//			Criteria criteria = session.createCriteria(Uzytkownik.class);
//			list = (List<Uzytkownik>) criteria.add(Restrictions.ilike("aktywowany", "NIe")).list();
//		
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		
		}	
		
		if(lista != null){
			for (Uzytkownik uzytkownik : lista) {
				try {
					out.println("<tr>");
					out.println("<td>" + uzytkownik.getLogin() + "</td>");
					out.println("<td>" + uzytkownik.getImie() + "</td>");
					out.println("<td>" + uzytkownik.getNazwisko() + "</td>");
					out.println("<td>" + uzytkownik.getMail() + "</td>");
					out.println("<td><a href='aktywuj.jsp?id_uzytkownika="+ uzytkownik.getId_uzytkownika() +"'> Aktywuj </a>");
					out.println("</tr>");
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		session.getTransaction().commit();
		return lista;
		
	}
	/**
	 * Metoda sprawdzajaca czy wszyscy uzytkownicy sa aktywowani
	 * @return true - jezeli wszyscy sa aktywowani <br> false - w przeciwnym wypadku
	 */
	public boolean nieaktywoaniSprawdz(){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		
		List<Uzytkownik> lista = null;
		boolean wynik = false;
		try{
			
			Query q = session.createQuery("from Uzytkownik where aktywowany = 'NIE' and prawa='u' ");
			
			lista = q.list();
			
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		
		}
		
		if(lista.isEmpty() == true){
			wynik = true;
		}else{
			wynik = false;
		}
		
		session.getTransaction().commit();
		return wynik;
	}
	
	/**
	 * Metoda zwracajaca liste aktywowanych uzytkownikow
	 * @param out
	 * @param root
	 * @return lista aktywowanych uzytkownikow
	 */
	public List<Uzytkownik> aktywowani(JspWriter out, String root){
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		
		BufferedImage zdjecie = null;
		List<Uzytkownik> lista = null;
		
		try{
			
			Query q = session.createQuery("from Uzytkownik where aktywowany = 'TAK' and prawa='u' ");
			
			lista = q.list();
		
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		
		}	
		String sciezka = "";
		for (Uzytkownik uzytkownik : lista) {
			try {
					sciezka = "http://rspkca.yoyo.pl/gladiator/zdjeciaProfilowe/"+ uzytkownik.getLogin() + "Profilowe.jpg";
				
				
				out.println("<tr>");
				out.println("<td><img src='" +sciezka + "' alt='Brak zdjecia' width='100px' height='100px' /></td>");
				out.println("<td>" + uzytkownik.getLogin() + "</td>");
				out.println("<td>" + uzytkownik.getImie() + "</td>");
				out.println("<td>" + uzytkownik.getNazwisko() + "</td>");
				out.println("<td>" + uzytkownik.getMail() + "</td>");
				out.println("<td><a href=dezaktywuj.jsp?id_uzytkownika="+ uzytkownik.getId_uzytkownika() +"> dezaktywuj </a></td>");
				out.println("</tr>");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	
		session.getTransaction().commit();
		return lista;
		
	}

	/**
	 * Metoda sluzaca do przegladania zawodnikow
	 * @param out
	 * @param root
	 * @return
	 */
public List<Uzytkownik> przegladajZawodnikow(JspWriter out, String root){
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		
		BufferedImage zdjecie = null;
		List<Uzytkownik> lista = null;
		
		try{
			
			Query q = session.createQuery("from Uzytkownik where aktywowany = 'TAK' and prawa='u' ");
			
			lista = q.list();
			
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		
		}	
		String sciezka = "";
		
		for (Uzytkownik uzytkownik : lista) {
			try {
					sciezka = "http://rspkca.yoyo.pl/gladiator/zdjeciaProfilowe/"+ uzytkownik.getLogin() + "Profilowe.jpg";
				
				
				out.println("<tr>");
				
				out.println("<td><a href=index.jsp?web=zawodnicy&zawodnik="+uzytkownik.getLogin()+"><img src='" +sciezka + "' alt='Brak zdjecia' width='100px' height='125px' /></a></td>");
				out.println("<td width=20px>");
				out.println("<td><a class=\"abc\" href=index.jsp?web=zawodnicy&zawodnik="+uzytkownik.getLogin()+">" + uzytkownik.getImie()+" "+uzytkownik.getNazwisko()+ "</a></td>");
			
				
				out.println("</tr>");
				out.println("<tr><td height=20px><td><td></tr>");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		session.getTransaction().commit();
		return lista;
		
	}
	
	
	/**
	 * Metoda sluzaca do dezaktywowania uzytkownika
	 * @param id_uzytkownika
	 * @return
	 */
	public Uzytkownik dezaktywuj(int id_uzytkownika){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Uzytkownik> listaZdjec = null;
		
		Query q = session.createQuery("from Uzytkownik where id_uzytkownika = " + id_uzytkownika);
		listaZdjec = q.list();
		
		for (Uzytkownik uzytkownik : listaZdjec) {
			
			Uzytkownik user = (Uzytkownik) session.load(Uzytkownik.class, uzytkownik.getId_uzytkownika());
			user.setAktywowany("NIE");
			session.update(user);
		}
		session.getTransaction().commit();
		return null;
		
	}
	
	/**
	 * Metoda sluzaca do aktywowania danego uzytkownika
	 * @param id_uzytkownika
	 * @return
	 */
	public Uzytkownik aktywuj(int id_uzytkownika){
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Uzytkownik> lista = null;
		
		Query q = session.createQuery("from Uzytkownik where id_uzytkownika = " + id_uzytkownika);
		lista = q.list();
		
		for (Uzytkownik uzytkownik : lista) {
			
			Uzytkownik user = (Uzytkownik) session.load(Uzytkownik.class, uzytkownik.getId_uzytkownika());
			user.setAktywowany("TAK");
			session.update(user);
		}
		session.getTransaction().commit();
		return null;
		
	}
	
	
}
